import { urlAddArgsByData } from '@/utils/index';
import { isNull } from '@/utils/validate';
import { getAccessToken } from '@/utils/accessToken';
import { tokenName, baseURL } from '@/config/index';

/**
 * 下载文件
 * @param url 文件下载地址
 */
export function downloadFile(url: string): void {
  try {
    let elemIF = document.querySelector('.downloadFileIframe') as HTMLIFrameElement;
    if (elemIF !== null && elemIF !== undefined) {
      elemIF.src = url;
    } else {
      elemIF = document.createElement('iframe');
      elemIF.className = 'downloadFileIframe';
      elemIF.src = url;
      elemIF.style.display = 'none';
      document.body.appendChild(elemIF);
    }
  } catch (e) {
    alert('下载异常！');
  }
}

/**
 * 下载文件（带参数）
 * @param url 下载接口地址
 * @param data 请求参数
 */
export function downloadFileByData(url: string, data?: Record<string, any>): void {
  if (!isNull(url)) {
    if (!isNull(data)) {
      // 设置Token认证
      data![tokenName] = getAccessToken();

      // 转换参数
      const params = Object.keys(data!)
        .map(function (key) {
          return encodeURIComponent(key) + '=' + encodeURIComponent(data![key]);
        })
        .join('&');
      url = baseURL + urlAddArgsByData(url, params);
    } else {
      // 没有参数时也要添加token
      const token = getAccessToken();
      if (token) {
        const params = encodeURIComponent(tokenName) + '=' + encodeURIComponent(token);
        url = baseURL + urlAddArgsByData(url, params);
      } else {
        url = baseURL + url;
      }
    }

    // 下载文件
    downloadFile(url);
  } else {
    alert('文件地址为空！');
  }
}

/**
 * 通过Blob下载文件
 * @param blob Blob对象
 * @param filename 文件名
 */
export function downloadFileByBlob(blob: Blob, filename: string): void {
  try {
    const url = window.URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = url;
    link.download = filename;
    link.style.display = 'none';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    window.URL.revokeObjectURL(url);
  } catch (e) {
    console.error('下载失败:', e);
    alert('下载异常！');
  }
}

/**
 * 通过URL直接下载文件
 * @param url 文件URL
 * @param filename 文件名（可选）
 */
export function downloadFileByUrl(url: string, filename?: string): void {
  try {
    const link = document.createElement('a');
    link.href = url;
    if (filename) {
      link.download = filename;
    }
    link.target = '_blank';
    link.style.display = 'none';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
  } catch (e) {
    console.error('下载失败:', e);
    alert('下载异常！');
  }
}

/**
 * 下载Excel模板
 * @param templateUrl 模板下载地址
 * @param filename 文件名（可选）
 */
export function downloadExcelTemplate(templateUrl: string, filename?: string): void {
  const url = baseURL + templateUrl;
  const token = getAccessToken();
  
  if (token) {
    const params = encodeURIComponent(tokenName) + '=' + encodeURIComponent(token);
    const finalUrl = urlAddArgsByData(url, params);
    downloadFile(finalUrl);
  } else {
    downloadFile(url);
  }
}

/**
 * 导出Excel文件
 * @param exportUrl 导出接口地址
 * @param data 导出参数
 * @param filename 文件名（可选）
 */
export function exportExcel(exportUrl: string, data?: Record<string, any>, filename?: string): void {
  downloadFileByData(exportUrl, data);
} 